//
//  Course.swift
//  cnswift-demo
//
//  Created by YangWei on 2021/1/7.
//  Copyright © 2021 YangWei. All rights reserved.
//

import UIKit

enum SWDCourseContent {
    /// 基础内容
    case SWDCourseBasicContent
    /// 基本运算符
    case SWDCourseBasicOperators
}

class Course: Base {
    class func run() {
        
        // 基础内容
        BasicContent.run()
        
        // 基本运算符
        BasicOperators.run()
        
        // 字符串和字符
        StringsAndCharacters.run()
        
        // 集合类型
        CollectionTypes.run()
        
        // 控制流
        ControlFlow.run()
        
        // 函数
        Functions.run()
        
        // 闭包
        Closures.run()
        
        // 枚举
        Enumerations.run()
                
        // 类和结构体
        StructuresAndClasses.run()
        
        // 属性
        Properties.run()
        
        // 方法
        Methods.run()
        
        // 下标
        Subscripts.run()
                
        // 继承
        Inheritance.run()
                
        // 初始化
        Initialization.run()
                
        // 反初始化
        Deinitialization.run()
                
        // 可选链
        OptionalChaining.run()
                
        // 错误处理
        ErrorHandling.run()
        
        // 并发
        Concurrency.run()
                
        // 类型转换
        TypeCasting.run()
                
        // 内嵌类型
        NestedTypes.run()
                
        // 扩展
        Extensions.run()
                
        // 协议
        Protocols.run()
        
        // 泛型
        Generics.run()
        
        // 不透明类型
        OpaqueTypes.run()
        
        // 自动引用计数
        AutomaticReferenceCounting.run()
        
        // 内存安全
        MemorySafety.run()
    }
    
    func test_enum_func() {
        let enumTestObjc = enum_test()
        // 打印枚举原始值
        enumTestObjc.showRawValue()
        // 枚举比较
        enumTestObjc.compareTest()
        // init?(rawValue:) 创建枚举实例
        enumTestObjc.initCreateTest()
        // no rawValue enum
        enumTestObjc.noRawValueEnumTest()
        // rawValue after init
        enumTestObjc.rawValueAfterInitTest()
    }
    
    func test_struct_func() {
        let structTestObjc = struct_test()
        // 基本使用
        structTestObjc.structUseTest()
    }
    
    func testTypeCasting() {
        let objc = TypeCasting()
        objc.test()
    }
    
    func testProtocols() {
        let objc = Protocols()
        objc.test()
    }
}
